package com.sicheng.lc.lc笔试.美团篇;

import java.util.*;

/**
 * @author zsc
 * @version 1.0
 * @date 2022/4/24 17:25
 */
public class 颜色排序 {
    /**
     * 颜色排序
     * 时间限制： 3000MS
     * 内存限制： 589824KB
     * 题目描述：
     * 小美得到了一个长度为n的整数序列，并且序列上每个数字都被染上了颜色1~n的其中一种。现在小美想要给这个序列按从小到大排序，但她每次操作只能交换相邻两个数，并且这两个数的颜色要不相同。她想知道进行若干次操作之后能不能给这个序列排好序。
     * 输入描述
     * 第一行一个正整数T，表示有T组数据。
     * 对于每一组数据，第一行一个正整数n，表示这个序列的长度；第二行n个正整数ai，表示该序列；第三行n个正整数ci，表示第 i 个数的颜色。
     * <p>
     * 数字间两两有空格隔开
     * <p>
     * 1≤T≤8，1≤n≤104 ，1≤ai,ci≤n
     * <p>
     * 输出描述
     * 对于每一组数据，如果可以排好序，输出一行Yes；否则，输出一行No。
     * 样例输入
     * <p>
     * <p>
     * 2
     * 5
     * 3 2 4 1 5
     * 1 2 2 3 1
     * 3
     * 2 2 1
     * 1 1 1
     * 样例输出
     * <p>
     * <p>
     * Yes
     * No
     * 样例解释
     * <p>
     * 第一组样例可以如下排序：
     * <p>
     * [3 2 4 1 5] -> [2 3 4 1 5] -> [2 3 1 4 5] -> [2 1 3 4 5] -> [1 2 3 4 5]
     * <p>
     * 作者：前尘忆梦
     * 链接：https://leetcode-cn.com/circle/discuss/0VOMnR/
     * 来源：力扣（LeetCode）
     * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
     */
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int t = scanner.nextInt();
        while (t-- > 0) {
            int n = scanner.nextInt();
            int[][] nums = new int[n][2];
            for (int i = 0; i < n; i++) {
                nums[i][0] = scanner.nextInt();
            }
            for (int i = 0; i < n; i++) {
                nums[i][1] = scanner.nextInt();
            }
            isOk(nums);
        }
    }

    // 大致思路 模拟
    // 先从最小的数开始, 将其逐步向前移动到对应的index位置。移动过程中遇到同色就无法移到对应位置 那么就是NO
    private static void isOk(int[][] nums) {

        // 初始值，第一个要移动的元素到达的位置
        int start = 0;

        Map<Integer, List<Integer>> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            List<Integer> index = map.get(nums[i][0]);
            if (index == null) {
                index = new ArrayList<>();
                map.put(nums[i][0], index);
                index.add(i);
            }
        }
        ArrayList<Integer> keys = new ArrayList<>(map.keySet());
        Collections.sort(keys);

        for (Integer key : keys) {
            List<Integer> indexes = map.get(key);
            Collections.sort(indexes);
            for (int i = 0; i < indexes.size(); i++) {
                //key  index
                int index = indexes.get(i);
                if (index > 0)
                    for (int j = index; j > start; j--) {
                        if (nums[index][1] == nums[j - 1][1]) {
                            System.out.println("NO");
                            return;
                        }
                    }
                if (index != start) {
                    indexes.set(i, start);
                    // todo
                    List<Integer> list = map.get(nums[start][0]);
                    list.set(list.indexOf(start), index);
                    swap(nums, index, start);
                }
                start++;
            }
        }

        System.out.println("YES");

    }

    private static void swap(int[][] nums, int index, int start) {
        int[] temp = nums[index];
        nums[index] = nums[start];
        nums[start] = temp;
    }
}
